package com.bianguo.android.recyclerlibrary.manager;

import android.support.v4.util.SparseArrayCompat;

import com.bianguo.android.recyclerlibrary.holder.RViewHolder;
import com.bianguo.android.recyclerlibrary.listener.RViewItem;

/**
 * 多类型item管理器
 * @param <T>
 */
public class RViewItemManager<T> {

    // 非常高效的数据存储接口，基本可以带胎HashMap
    // key = viewType, value = RViewItem
    private SparseArrayCompat<RViewItem<T>> styles;

    public RViewItemManager() {
        styles = new SparseArrayCompat<>();
    }

    /**
     * 判断是否有多项式，如果 > 0表示有多样式
     * @return
     */
    public int getItemViewStyleCount() {
        return styles.size();
    }

    public void addStyles(RViewItem<T> item) {
        if (item != null) {
            styles.put(styles.size(), item);
        }
    }

    /**
     * 根据数据源和位置返回某个Item类型的viewType（集合的key）
     * @param data
     * @param position
     * @return
     */
    public int getItemViewType(T data, int position) {
        // 样式倒序循环，防止增删集合抛出异常
        for (int i = styles.size() - 1; i >= 0; i--) {
            RViewItem<T> item = styles.valueAt(i);
            //是否为当前的样式显示，有开发者外面实现
            if (item.isItemView(data, position)) {
                return styles.keyAt(i);
            }
        }
        throw new IllegalArgumentException(position + "位置没有匹配的条目样式");
    }

    /**
     * 根据显示的viewType返回RViewItem对象（集合的value ）
     * @param viewType
     * @return
     */
    public RViewItem getRViewItem(int viewType) {
        return styles.get(viewType);
    }

    /**
     * 视图与数据源的绑定显示
     * @param holder
     * @param data
     * @param position
     */
    public void convert(RViewHolder holder, T data, int position) {
        int size = styles.size();
        for (int i = 0; i < size; i++) {
            RViewItem<T> item = styles.valueAt(i);
            if (item.isItemView(data, position)) {
                item.convert(holder, data, position);
                return;
            }
        }
        throw new IllegalArgumentException(position + "位置没有匹配的条目样式");
    }
}
